﻿//////////////////////////////////////////////////////////////////
//
// Main.cs
//
// Copyright (c) 2012 Dan Pike.
//
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation files
// (the "Software"), to deal in the Software without restriction,
// including without limitation the rights to use, copy, modify, merge,
// publish, distribute, sub-license, and/or sell copies of the Software,
// and to permit persons to whom the Software is furnished to do so,
// subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DanPike.Utilities;

namespace Hester
{
   public partial class Main : Form
   {
      private Logger Logger = Program.Logger;
      private Dictionary<string, Folder> Folders = new Dictionary<string, Folder>(StringComparer.CurrentCultureIgnoreCase);
      private Accounts Accounts = new Accounts();
      private Servers Servers = new Servers();
      private Toons Toons = new Toons();

      ////////////////////////////////////////////////////////////////////////
      /// <summary>
      /// 
      /// </summary>
      public Main()
      {
         InitializeComponent();
      }

      ////////////////////////////////////////////////////////////////////////
      /// <summary>
      /// 
      /// </summary>
      /// <param name="sender"></param>
      /// <param name="e"></param>
      private void exitToolStripMenuItem_Click(object sender, EventArgs e)
      {
         Close();
      }

      ////////////////////////////////////////////////////////////////////////
      /// <summary>
      /// 
      /// </summary>
      private void loadConfiguredFolders()
      {
         // Load all of the Folders that are in the configuration
         foreach (Config.Folder configFolder in Program.Settings.Folders.Value)
         {
            Folder folder;
            string folderUrl = configFolder.Url.Value;
            if (!Folders.TryGetValue(folderUrl, out folder))
            {
               folder = new Folder();
               folder.Url = folderUrl;
               Folders.Add(folderUrl, folder);

               Accounts.AccountAdded += new Accounts.AccountAddedEventHandler(handleAccountAdded);

               folder.loadAccounts(Accounts, Servers, Toons);
            }
         }
      }

      ////////////////////////////////////////////////////////////////////////
      /// <summary>
      /// 
      /// </summary>
      private void handleAccountAdded(object sender, Accounts.AccountAddedEventArgs eventArgs)
      {
         try
         {
            Logger.InfoFormat("found account '{0}'", eventArgs.Account.Name);
            SafeAsyncInvoker.BeginInvoke(lvAccounts, () =>
               lvAccounts.Items.Add(eventArgs.Account.Name)
               );
         }
         catch (System.Exception ex)
         {
            Logger.Exception(ex);
         }
      }

      ////////////////////////////////////////////////////////////////////////
      /// <summary>
      /// 
      /// </summary>
      private void showConfiguredFolders()
      {
         // Load all of the Folders that are in the configuration
         SafeAsyncInvoker.BeginInvoke(lvToons, () =>
            Folders.Values.ToList().ForEach(folder => folder.Show(lvToons, Toons))
         );
      }

      ////////////////////////////////////////////////////////////////////////
      /// <summary>
      /// 
      /// </summary>
      /// <param name="sender"></param>
      /// <param name="e"></param>
      private void Main_Load(object sender, EventArgs e)
      {
         try
         {
            loadConfiguredFolders();
         }
         catch (System.Exception ex)
         {
            Logger.Exception(ex);
         }
      }

      ////////////////////////////////////////////////////////////////////////
      /// <summary>
      /// 
      /// </summary>
      /// <param name="sender"></param>
      /// <param name="e"></param>
      private void Main_Shown(object sender, EventArgs e)
      {
         try
         {
            showConfiguredFolders();
         }
         catch (System.Exception ex)
         {
            Logger.Exception(ex);
         }
      }

      ////////////////////////////////////////////////////////////////////////
      /// <summary>
      /// 
      /// </summary>
      /// <param name="sender"></param>
      /// <param name="e"></param>
      private void lvToons_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
      {
         try
         {
            if (e.IsSelected)
            {
            }
         }
         catch (System.Exception ex)
         {
            Logger.Exception(ex);
         }
      }
   }
}
